home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Camelot / Camelot 030 (1988-11)(Swedish User Group of Amiga)(SE)(PD)[WB].zip / Camelot 030 (1988-11)(Swedish User Group of Amiga)(SE)(PD)[WB].adf / PathDev / BSET.ASM next >
Assembly Source File  |  1988-10-25  |  1KB  |  47 lines

  1.  
  2. ;BSET.ASM
  3. ;BZERO.ASM
  4. ;
  5. ;   Uses longword operations if data is aligned on a longword boundry
  6. ;   and the size is a mulitple of 4.  Otherwise, uses byte operations.
  7.  
  8.     xdef  _bset
  9.     xdef  _bzero
  10.  
  11. _bzero
  12.     clr.l    D1
  13.     bra    begin
  14. _bset
  15.     move.b    15(A7),D1    ;12(A7)-> msb . . lsb    (D1 = data)
  16. begin
  17.     move.l    4(A7),A0    ;A0 = address
  18.     move.l    8(A7),D0    ;D0 = byte count
  19.     andi.b    #3,11(A7)    ;byte count on long word boundry?
  20.     bne    drop
  21.     andi.b    #3,7(A7)    ;address on longword boundry?
  22.     bne    drop
  23.     bra    lwb
  24. loop    move.b    D1,(A0)+    ;BYTE SET LOOP
  25. drop    dbf.w    D0,loop     ;remember, only effects lower word
  26.     sub.l    #$10000,D0    ;for buffers >65535
  27.     bpl    loop        ;branch to loop because D0.W now is FFFF
  28.     rts
  29.  
  30. lwb    lsr.l    #2,D0        ;byte count / 4 (longword chunks)
  31.     tst.l    D1        ;BZERO
  32.     beq    dropl
  33.     move.b    D1,14(A7)    ;15(A7) already contains the byte
  34.     move.w    14(A7),D1    ;D1 0..15 set
  35.     swap    D1
  36.     move.w    14(A7),D1    ;D1 16..31 set
  37.     bra    dropl
  38.  
  39. loopl    move.l    D1,(A0)+    ;BYTE SET LOOP
  40. dropl    dbf.w    D0,loopl    ;remember, only effects lower word
  41.     sub.l    #$10000,D0    ;for buffers >65535
  42.     bpl    loopl        ;branch to loop because D0.W now is FFFF
  43.     rts
  44.  
  45.  
  46.  
  47.